<?php
 /** @package NOTANET - Version 2011 - Fonctions de gestion */
 /**
 * Definition de quelques constantes
 */
 $ds = SQL_commande ("SELECT * FROM notanet_disciplines_speciales ORDER BY identifiant DESC", $id_sql) ;
 $disciplines_speciales [0][0] = SQL_nbr_lignes ($ds) ;
 For ($i = 1 ; $i <= $disciplines_speciales [0][0] ; $i++)
  {
   $d = SQL_tableau_associatif ($ds, "") ;
   $disciplines_speciales [$i][0] = $d ["identifiant"] ; // Codage (ATTENTION : Ne pas modifier apres la premiere utilisation)
   $disciplines_speciales [$i][1] = filtrage_utf8 ($d ["libelle"]) ; // Libelle
   $disciplines_speciales [$i][2] = filtrage_utf8 ($d ["titre"]) ; // Titre
  }
 $absent = "AB" ;
 $non_note = "NN" ;
 $dispense = "DI" ;
 
 // Fin de ligne
 $fin_ligne = "\r\n" ;
 // Separateur
 $separateur = "|" ;
 
 /**
 * Permet de savoir si NOTANET a ete active sur un etablissement
 * @param int $id_etablissement Identifiant de l'etablissement
 * @return int 0=Non actif, 1=Actif
 */
 Function notanet_actif ($id_etablissement)
  {
   $ok = restaure_configuration ("SYSTEME_PARAM", "NOTANET_".$id_etablissement, "ACTIVATION") ;
   If ($ok == "") { $ok = 0 ; }
   Return $ok ;
  }
 
 /**
 * Permet de savoir si NOTANET a ete active sur une classe
 * @param int $id_classe Identifiant de la classe
 * @return int 0=Non actif, 1=Actif
 */
 Function notanet_actif_classe ($id_classe)
  {
   $id_etablissement = id_etablissement_par_id_classe ($id_classe) ;
   $ok = notanet_actif ($id_etablissement) ;
   If ($ok == 1)
    {
     $ok = restaure_configuration ("SYSTEME_PARAM", "NOTANET_".$id_etablissement, "CLASSE_".$id_classe) ;
     If ($ok == "") { $ok = 0 ; }
    }
   Return $ok ;
  }
 
 /**
 * Activation du menu NOTANET pour le secretariat ou la direction
 * @return int 0=Non actif, 1=Actif
 */
 Function notanet_menu_actif ()
  {
   Global $id_sql ;
   $ok = 0 ;
   $etab = SQL_commande ("SELECT id_etablissement FROM etablissements", $id_sql) ;
   $nbr = SQL_nbr_lignes ($etab) ;
   If ($nbr > 0)
    {
     For ($i = 0 ; $i < $nbr ; $i++)
      {
       $r = SQL_ligne_suivante ($etab) ;
       If (notanet_actif ($r [0]) == 1) { $ok = 1 ; }
      }
    }
   Return $ok ;
  }
 
 /**
 * Renvoi le nom d'un profil
 * @param int $id_notanet_profil Identifiant du profil
 * @return string Nom du profil si xiste sinon vide
 */
 Function notanet_nom_profil ($id_notanet_profil)
  {
   Global $id_sql ;
   $r = SQL_commande ("SELECT nom FROM notanet_profils WHERE id_notanet_profil='".$id_notanet_profil."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1) { $res = SQL_ligne_suivante ($r) ; } Else { $res [0] = "" ; }
   //Return filtrage_utf8 ($res [0]) ;
   Return $res [0] ;
  }
 
 /**
 * Renvoi le nom d'un profil par identifiant du code epreuve correspondant
 * @param int $id_notanet_code_epreuve Identifiant du code epreuve
 * @return string Nom du profil si existe sinon vide
 */
 Function notanet_nom_profil_par_id_code_epreuve ($id_notanet_code_epreuve)
  {
   Global $id_sql ;
   $r = SQL_commande ("SELECT p.nom FROM notanet_profils p,notanet_codes_epreuves c WHERE c.id_notanet_code_epreuve='".$id_notanet_code_epreuve."' AND c.id_notanet_profil=p.id_notanet_profil LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1) { $res = SQL_ligne_suivante ($r) ; } Else { $res [0] = "" ; }
   //Return filtrage_utf8 ($res [0]) ;
   Return $res [0] ;
  }
 
 /**
 * Renvoi le nom d'un profil par id profil classe
 * @param int $id_notanet_profil Identifiant du profil
 * @return string Nom du profil si xiste sinon vide
 */
 Function notanet_nom_profil_classe ($id_notanet_profil_classe)
  {
   Global $id_sql ;
   $r = SQL_commande ("SELECT p.nom FROM notanet_profils p,notanet_profils_classes c WHERE c.id_notanet_profil_classe='".$id_notanet_profil_classe."' AND c.id_notanet_profil=p.id_notanet_profil LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1) { $res = SQL_ligne_suivante ($r) ; } Else { $res [0] = "" ; }
   //Return filtrage_utf8 ($res [0]) ;
   Return $res [0] ;
  }

 /**
 * Renvoi les caracteristiques d'un profil
 * @param int $id_notanet_profil_classe Identifiant du profil classe
 * @return array Table contenant d'id classe [0] et l'id notanet profil [1] sinon [0]=[1]=0
 */
 Function notanet_elements_profil ($id_notanet_profil_classe)
  {
   Global $id_sql ;
   $r = SQL_commande ("SELECT id_classe,id_notanet_profil FROM notanet_profils_classes WHERE id_notanet_profil_classe='".$id_notanet_profil_classe."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1) { $res = SQL_ligne_suivante ($r) ; } Else { $res [0] = $res [1] = 0 ; }
   Return $res ;
  }
 
 /**
 * Renvoi l'arrondi d'un profil
 * @param int $id_notanet_profil Identifiant du profil
 * @return int Numero d'arrondi sinon 0 par defaut
 */
 Function notanet_arrondi_profil ($id_notanet_profil)
  {
   Global $id_sql ;
   $r = SQL_commande ("SELECT arrondi FROM notanet_profils WHERE id_notanet_profil='".$id_notanet_profil."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1) { $res = SQL_ligne_suivante ($r) ; } Else { $res [0] = 0 ; }
   Return $res [0] ;
  } 
 
 /**
 * Renvoi le nom code epreuve
 * @param int $id_notanet_code_epreuve Identifiant du code epreuve
 * @return string Nom du code epreuve si existe sinon vide
 */
 Function notanet_code_epreuve ($id_notanet_code_epreuve)
  {
   Global $id_sql ;
   $r = SQL_commande ("SELECT code FROM notanet_codes_epreuves WHERE id_notanet_code_epreuve='".$id_notanet_code_epreuve."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1) { $res = SQL_ligne_suivante ($r) ; } Else { $res [0] = "" ; }
   Return $res [0] ;
  }
 
 /**
 * Renvoi le nom de la discipline specifique (si existe) sinon rien
 * @param int $id_notanet_code_epreuve Identifiant du code epreuve
 * @param int $id_classe Identifiant de la classe
 * @return string Nom de la discipline specifique si existe sinon vide
 */
 Function notanet_nom_discipline ($id_notanet_code_epreuve, $id_classe)
  {
   Global $id_sql ;
   $r = SQL_commande ("SELECT nom_discipline FROM notanet_definitions WHERE id_notanet_code_epreuve='".$id_notanet_code_epreuve."' AND id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1) { $res = SQL_ligne_suivante ($r) ; } Else { $res [0] = "" ; }
   If ($res [0] == "")
    {
     $r = SQL_commande ("SELECT id_discipline FROM notanet_codes_epreuves WHERE id_notanet_code_epreuve='".$id_notanet_code_epreuve."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($r) == 1)
      {
       $res = SQL_ligne_suivante ($r) ;
       If ($res [0] > 0)
        {
         // Recherche nom disipline normale
         $r = SQL_commande ("SELECT nom_long FROM disciplines WHERE id_discipline='".$res [0]."' LIMIT 1", $id_sql) ;
        }
       Else
        {
         // Recherche nom discipline specifique
         $r = SQL_commande ("SELECT libelle FROM notanet_disciplines_speciales WHERE identifiant='".$res [0]."' LIMIT 1", $id_sql) ;
        }
       If (SQL_nbr_lignes ($r) == 1) { $res = SQL_ligne_suivante ($r) ; } Else { $res [0] = "" ; }
      }
     Else { $res [0] = "" ; }
    }
   Return $res [0] ;
  }
 
 /**
 * Verifie si un code epreuve existe deja
 * @param int $id_profil Identifiant du profil
 * @param int $code Code de l'epreuve a tester
 * @return int 0=Non existant, 1=Existant
 */
 Function notanet_code_existe ($id_profil, $code)
  {
   Global $id_sql ;
   $code = filtrage (filtrage_utf8 ($code)) ;
   $ok = 0 ;
   $r = SQL_commande ("SELECT id_notanet_code_epreuve FROM notanet_codes_epreuves WHERE id_notanet_profil='".$id_profil."' AND code='".$code."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1) { $ok = 1 ; }
   Return $ok ;
  }
 
 /**
 * Fonction qui renvoi toutes les notes particulieres autorisees en fonction d'un identifiant de code epreuve
 * @param int $id_notanet_code_epreuve Identifiant d'un code epreuve
 * @return array Tableau contenant l'ensemble des notes particulieres autorisees
 *               Format : [0][0] = Nombre de notes
 *                        Pour $i allant de 1 a [0][0]
 *                         [$i][0] = Identifiant de la note particuliere
 *                         [$i][1] = Code
 *                         [$i][2] = Libelle
 */
 Function notanet_notes_particulieres ($id_notanet_code_epreuve)
  {
   Global $id_sql ;
   $np = SQL_commande ("SELECT t.id_notanet_type_note,t.code,t.libelle FROM notanet_types_notes t,notanet_proprietes p
                         WHERE p.id_notanet_code_epreuve='".$id_notanet_code_epreuve."'
			   AND p.id_notanet_type_note=t.id_notanet_type_note ORDER BY t.code,t.libelle", $id_sql) ;
   $table [0][0] = SQL_nbr_lignes ($np) ;
   If ($table [0][0] > 0)
    {
     For ($i = 1 ; $i <= $table [0][0] ; $i++)
      {
       $npc = SQL_ligne_suivante ($np) ;
       $table [$i][0] = $npc [0] ;
       $table [$i][1] = $npc [1] ;
       $table [$i][2] = $npc [2] ;
      }
    }
   Return $table ;
  }
 
 /**
 * Fonction qui renvoi toutes les caracteristiques et les notes particulieres autorisees en fonction d'un identifiant de code epreuve
 * @param int $id_notanet_code_epreuve Identifiant d'un code epreuve
 * @return array Tableau contenant l'ensemble des caracteristiques et notes particulieres autorisees
 *               Format : [0][0] = Nombre de notes
 *                        [0][1] = Mode de calcul
 *                        [0][2] = Borne superieure
 *                        [0][3] = Coefficient
 *                        [0][4] = Obligatoire (1) ou pas (0)
 *                        Pour $i allant de 1 a [0][0]
 *                         [$i][0] = Identifiant de la note particuliere
 *                         [$i][1] = Code
 *                         [$i][2] = Libelle
 */
 Function notanet_caracteristiques_code ($id_notanet_code_epreuve)
  {
   Global $id_sql ;
   $np = SQL_commande ("SELECT p.mode_calcul,p.borne_superieure,p.coefficient,p.mouvement,t.id_notanet_type_note,t.code,t.libelle FROM notanet_types_notes t,notanet_proprietes p
                         WHERE p.id_notanet_code_epreuve='".$id_notanet_code_epreuve."'
			   AND p.id_notanet_type_note=t.id_notanet_type_note ORDER BY t.code,t.libelle", $id_sql) ;
   $table [0][0] = SQL_nbr_lignes ($np) ;
   If ($table [0][0] > 0)
    {
     For ($i = 1 ; $i <= $table [0][0] ; $i++)
      {
       $npc = SQL_ligne_suivante ($np) ;
       If ($i == 1)
        {
	 $table [0][1] = $npc [0] ;
	 $table [0][2] = $npc [1] ;
	 $table [0][3] = $npc [2] ;
	 $table [0][4] = $npc [3] ;
	}
       $table [$i][0] = $npc [4] ;
       $table [$i][1] = $npc [5] ;
       $table [$i][2] = $npc [6] ;
      }
    }
   Return $table ;
  }
 
 /**
 * Renvoi sous forme d'un tableau l'ensemble de la codification des epreuves d'une serie NOTANET
 * @param int $id_notanet_profil Identifiant du profil
 * @return array Codes epreuves.
 *         Format : [0][0][0] : Identifiant du profil
 *                  [0][0][1] : Nombre de codes epreuves
 *                  [0][0][2] : Nombre de type de notes
 *  Si $i est le numero de code epreuve :
 *   Pour $i > 0,   [$i][0][0] : Identifiant code epreuve
 *                  [$i][0][1] : Code epreuve
 *                  [$i][0][2] : Identifiant discipline (-1=langue 1;-2=Langue 2;-3=Option;-4=Vie scolaire;-5:Socle B2i;-6:Socle niveau A2 de langue etrangere;-7:Niveau A2 de langue regionale)
 *                  [$i][0][3] : Nom de la matiere
 *                  [$i][0][4] : Mode de calcul
 *                  [$i][0][5] : Borne superieure
 *                  [$i][0][6] : Coefficient
 *                  [$i][0][7] : Mouvement obligatoire(1) ou pas (0)
 * Si $j est le numero de type de note :
 *   Pour $j >= 0,  [$i][1][$j] : Identifiant du type de note
 *                  [$i][2][$j] : Note particuliere autorisee
 *                  [$i][3][$j] : Libelle de la note particuliere autorisee
 *
 *
 *
 */
 Function notanet_caracteristiques_profil ($id_notanet_profil)
  {
   Global $id_sql, $disciplines_speciales ;
   // Retrouves tous les codes avec les id_disciplines
   $cds = SQL_commande ("SELECT id_notanet_code_epreuve,code,id_discipline FROM notanet_codes_epreuves WHERE id_notanet_profil='".$id_notanet_profil."' ORDER BY code", $id_sql) ;
   $nombre_codes = SQL_nbr_lignes ($cds) ;
   For ($i = 0 ; $i < $nombre_codes ; $i++)
    {
     $cd = SQL_ligne_suivante ($cds) ;
     $codes [$i][0] = $cd [0] ;
     $codes [$i][1] = $cd [1] ;
     $codes [$i][2] = $cd [2] ;
    }
   
   // Recherche des disciplines "normales"
   $proprietes = SQL_commande ("SELECT c.id_notanet_profil,c.code,c.id_discipline,p.*,t.id_notanet_type_note,t.code AS code_note,t.libelle,d.nom_long FROM notanet_codes_epreuves c,notanet_proprietes p,notanet_types_notes t,disciplines d WHERE c.id_notanet_profil='".$id_notanet_profil."' AND p.id_notanet_code_epreuve=c.id_notanet_code_epreuve AND p.id_notanet_type_note=t.id_notanet_type_note AND c.id_discipline=d.id_discipline AND c.id_discipline>0 ORDER BY c.code,t.code", $id_sql) ;
     
   // Recherche les disciplines "speciales"
   $requete = "SELECT c.id_notanet_profil,c.code,c.id_discipline,p.*,t.id_notanet_type_note,t.code AS code_note,t.libelle FROM notanet_codes_epreuves c,notanet_proprietes p,notanet_types_notes t WHERE c.id_notanet_profil='".$id_notanet_profil."' AND p.id_notanet_code_epreuve=c.id_notanet_code_epreuve AND p.id_notanet_type_note=t.id_notanet_type_note AND (" ;
   For ($i = 1 ; $i <= $disciplines_speciales [0][0] ; $i++)
    {
     If ($i > 1) { $requete .= " OR " ; }
     $requete .= "c.id_discipline='".$disciplines_speciales [$i][0]."'" ;
    }
   $requete .= ") ORDER BY c.code,t.code" ;    
   $disc_spe = SQL_commande ($requete, $id_sql) ;
     
   $nombre_proprietes = SQL_nbr_lignes ($proprietes) ;
   $nombre_speciaux = SQL_nbr_lignes ($disc_spe) ;
   If ($nombre_codes > 0)
    {
     $p = SQL_tableau_associatif ($proprietes, "") ;
     $s = SQL_tableau_associatif ($disc_spe, "") ;
     $r = SQL_commande ("SELECT id_notanet_type_note,code,libelle FROM notanet_types_notes ORDER BY code", $id_sql) ;
     $nombre_notes = SQL_nbr_lignes ($r) ;
     $i_p = $i_s = 0 ;
     $tableau [0][0][0] = $id_notanet_profil ; // Identifiant du profil
     $tableau [0][0][1] = $nombre_codes ; // Nombre de codes epreuves
     $tableau [0][0][2] = $nombre_notes ; // Nombre de type de notes
     For ($i = 0 ; $i < $nombre_codes ; $i++)
      {
       $tableau [$i+1][0][0] = $codes [$i][0] ; // Identifiant code epreuve
       $tableau [$i+1][0][1] = $codes [$i][1] ; // Code epreuve
       $tableau [$i+1][0][2] = $codes [$i][2] ; // Identifiant discipline
       If ($codes [$i][2] > 0)
	{
	 // Discipline "normale"
	 $tableau [$i+1][0][3] = filtrage_utf8 ($p ["nom_long"]) ; // Nom de la matiere
         $tableau [$i+1][0][4] = $p ["mode_calcul"] ; // Mode de calcul
         $tableau [$i+1][0][5] = $p ["borne_superieure"] ; // Borne superieure
         $tableau [$i+1][0][6] = $p ["coefficient"] ; // Coefficient
	 $tableau [$i+1][0][7] = $p ["mouvement"] ; // Mouvement obligatoire (1) ou pas (0)
         For ($j = 0 ; $j < $nombre_notes ; $j++)
          {
  	   If (($p ["code"] == $codes [$i][1]) And ($i_p < $nombre_proprietes))
	    {
	     $tableau [$i+1][1][$j] = $p ["id_notanet_type_note"] ; // Id du type de note
	     $tableau [$i+1][2][$j] = $p ["code_note"] ; // Notes particuliere autorisees
	     $tableau [$i+1][3][$j] = $p ["libelle"] ; // Libelle de la note particuliere autorisee
	     $p = SQL_tableau_associatif ($proprietes, "") ;
	     $i_p++ ;
	    }
	   Else
	    {
	     $tableau [$i+1][1][$j] = 0 ; // Id du type de note
	     $tableau [$i+1][2][$j] = "" ; // Notes particuliere autorisees
	     $tableau [$i+1][3][$j] = "" ; // Libelle de la note particuliere autorisee
	    }
          }
         If ($p ["code"] == $codes [$i][1]) { $p = SQL_tableau_associatif ($proprietes, "") ; }
	}
       Else
	{
	 // Discipline "speciale"
	 $disc = SQL_commande ("SELECT libelle FROM notanet_disciplines_speciales WHERE identifiant='".$codes [$i][2]."' LIMIT 1", $id_sql) ;
	 $nom_disc_speciale = SQL_ligne_suivante ($disc) ;
	 $tableau [$i+1][0][3] = filtrage_utf8 ($nom_disc_speciale [0]) ; // Nom de la matiere
         $tableau [$i+1][0][4] = $s ["mode_calcul"] ; // Mode de calcul
         $tableau [$i+1][0][5] = $s ["borne_superieure"] ; // Borne superieure
         $tableau [$i+1][0][6] = $s ["coefficient"] ; // Coefficient
	 $tableau [$i+1][0][7] = $s ["mouvement"] ; // Mouvement obligatoire (1) ou pas (0)
         For ($j = 0 ; $j < $nombre_notes ; $j++)
          {
  	   If (($s ["code"] == $codes [$i][1]) And ($i_s < $nombre_speciaux))
	    {
	     $tableau [$i+1][1][$j] = $s ["id_notanet_type_note"] ; // Id du type de note
	     $tableau [$i+1][2][$j] = $s ["code_note"] ; // Notes particuliere autorisees
	     $tableau [$i+1][3][$j] = $s ["libelle"] ; // Libelle de la note particuliere autorisee
	     $s = SQL_tableau_associatif ($disc_spe, "") ;
	     $i_s++ ;
	    }
	   Else
	    {
	     $tableau [$i+1][1][$j] = 0 ; // Id du type de note
	     $tableau [$i+1][2][$j] = "" ; // Notes particuliere autorisees
	     $tableau [$i+1][3][$j] = "" ; // Libelle de la note particuliere autorisee
	    }
          }
         If ($s ["code"] == $codes [$i][1]) { $s = SQL_tableau_associatif ($disc_spe, "") ; }
	}
      }
    }
   Else { $tableau [0][0] = 0 ; }
   Return $tableau ;
  }
 
 /**
 * Fonction qui renvoi la definition code epreuve <-> discipline classe pour une classe donnee
 * @param int id_classe Identifiant de la classe
 * @param int $id_notanet_profil Identifiant du profil a definir
 * @return array Definition Code epreuve <-> Discipline classe
 *  Format de la fonction notanet_caracteristiques_profil ($id_notanet_profil) avec en plus :
 *         Section possibilitees :
 *               [$i][4][0]  : Nombre d'id service prof ou 0 si definition inexistante
 *               [$i][4][$j] : Id service prof attribuee
 *               [$i][5][$j] : Id prof correspondant
 *               [$i][6][$j] : Id discipline correspondant
 *               [$i][7][$j] : 0=Pas optionnelle sinon optionnelle
 *               [$i][8][$j] : 0=Pas en groupe sinon en groupe
 *               [$i][9][$j] : Numero d'ordre ou 0 si definition automatique
 *
 *         Section definitions :
 *               [$i][10][0]  : Nombre d'id service prof attribue ou 0 si definition inexistante
 *               [$i][10][$j] : Id service prof attribuee
 *               [$i][11][$j] : Id prof correspondant
 *               [$i][12][$j] : Id discipline correspondant
 *               [$i][13][$j] : 0=Pas optionnelle sinon optionnelle
 *               [$i][14][$j] : 0=Pas en groupe sinon en groupe
 *               [$i][15][$j] : Numero d'ordre ou 0 si definition automatique
 *               [$i][16][$j] : Nouveau nom de la discipline
 */
 Function notanet_definition_profil_classe ($id_classe, $id_notanet_profil)
  {
   Global $id_sql ;
   $table_profil = notanet_caracteristiques_profil ($id_notanet_profil) ;
   // Recherche discipline
   For ($i = 1 ; $i <= $table_profil [0][0][1] ; $i++)
    {
     // Non trouve -> On cherche directement
     If ($table_profil [$i][0][2] > 0)
      {
       $ok = SQL_commande ("SELECT s.id_service_prof,s.professeur,s.discipline,c.optionnelle,c.groupe,'0' FROM services_prof s,services_classe c WHERE s.classe='".$id_classe."' AND s.discipline='".$table_profil [$i][0][2]."' AND s.service_classe=c.id_service_classe", $id_sql) ;
       $table_profil [$i][4][0] = SQL_nbr_lignes ($ok) ;
       For ($j = 1 ; $j <= $table_profil [$i][4][0] ; $j++)
        {
         $ligne = SQL_ligne_suivante ($ok) ;
         $table_profil [$i][4][$j] = $ligne [0] ;
	 If ($ligne [1]  > 0) { $table_profil [$i][5][$j] = $ligne [1] ; }
	 ElseIf ($ligne [1] < 0)
	  {
	   // Alias
	   $ep = alias_enseignant_principal (-$ligne [1]) ;
	   $table_profil [$i][5][$j] = $ep [0] ;
	  }
	 Else { $table_profil [$i][5][$j] = 0 ; }
         $table_profil [$i][6][$j] = $ligne [2] ;
         $table_profil [$i][7][$j] = $ligne [3] ;
         $table_profil [$i][8][$j] = $ligne [4] ;
         $table_profil [$i][9][$j] = $ligne [5] ;
        }
      }
     Else
      {
       // Non trouve : Profil specifique a definir a la main
       $table_profil [$i][4][0] = 0 ;
      }
     // Recherche dans la table de definition les disciplines classiques
     $ok = SQL_commande ("SELECT s.id_service_prof,s.professeur,s.discipline,c.optionnelle,c.groupe,a.ordre,a.nom_discipline FROM notanet_definitions a,services_prof s,services_classe c WHERE a.id_notanet_code_epreuve='".$table_profil [$i][0][0]."' AND a.id_classe='".$id_classe."' AND a.id_service_prof=s.id_service_prof AND s.service_classe=c.id_service_classe ORDER BY a.ordre", $id_sql) ;
     $nbr = SQL_nbr_lignes ($ok) ;
     If ($nbr >= 1)
      {
       // Trouve -> OK
       $table_profil [$i][10][0] = $nbr ;
       For ($j = 1 ; $j <= $table_profil [$i][10][0] ; $j++)
        {
         $ligne = SQL_ligne_suivante ($ok) ;
         $table_profil [$i][10][$j] = $ligne [0] ;
         $table_profil [$i][11][$j] = $ligne [1] ;
         $table_profil [$i][12][$j] = $ligne [2] ;
         $table_profil [$i][13][$j] = $ligne [3] ;
         $table_profil [$i][14][$j] = $ligne [4] ;
         $table_profil [$i][15][$j] = $ligne [5] ;
	 $table_profil [$i][16][$j] = $ligne [6] ;
        }
      }
     // Recherche dans la table de definition les disciplines speciales
     $ok = SQL_commande ("SELECT id_service_prof,ordre,nom_discipline FROM notanet_definitions WHERE id_notanet_code_epreuve='".$table_profil [$i][0][0]."' AND id_classe='".$id_classe."' AND id_service_prof<0 ORDER BY ordre", $id_sql) ;
     $nbr = SQL_nbr_lignes ($ok) ;
     If ($nbr >= 1)
      {
       // Trouve -> OK
       For ($j = 1 ; $j <= $nbr ; $j++)
        {
         $ligne = SQL_ligne_suivante ($ok) ;
         $table_profil [$i][10][$table_profil [$i][10][0]+$j] = $ligne [0] ;
         $table_profil [$i][11][$table_profil [$i][10][0]+$j] = 0 ;
         $table_profil [$i][12][$table_profil [$i][10][0]+$j] = 0 ;
         $table_profil [$i][13][$table_profil [$i][10][0]+$j] = 0 ;
         $table_profil [$i][14][$table_profil [$i][10][0]+$j] = 0 ;
         $table_profil [$i][15][$table_profil [$i][10][0]+$j] = $ligne [1] ;
	 $table_profil [$i][16][$table_profil [$i][10][0]+$j] = $ligne [2] ;
        }
       $table_profil [$i][10][0] += $nbr ;
      }
    }
   Return $table_profil ;
  }
 
 /**
 * Fonction qui renvoi la liste de tous les eleves d'une classe avec leur profil associe (si existe sinon 0)
 * @param int $id_classe Identifiant de la classe
 * @return array Table contenant les eleves et profils
 *               Format : [0][0] = Nombre d'eleves dans l'ordre alphabetique
 *                        Pour $i > 1
 *                         [$i][0] = Identifiant eleve
 *                         [$i][1] = Nom eleve
 *                         [$i][2] = Prenom eleve
 *                         [$i][3] = Identifiant profil si existe sinon 0
 *                         [$i][4] = Nom du profil si existe sinon rien
 *                         [$i][5] = Type d'arrondi
 */
 Function notanet_profil_eleves ($id_classe)
  {
   Global $id_sql ;
   $table [0][0] = 0 ;
   // Recherche tous les eleves
   $eleves = SQL_commande ("SELECT id_eleve,nom,prenoms FROM eleves WHERE classe='".$id_classe."' ORDER BY nom,prenoms,date_naissance", $id_sql) ;
   $nbr = SQL_nbr_lignes ($eleves) ;
   If ($nbr > 0)
    {
     $table [0][0] = $nbr ;
     For ($i = 1 ; $i <= $nbr ; $i++)
      {
       $eleve = SQL_ligne_suivante ($eleves) ;
       $table [$i][0] = $eleve [0] ;
       $table [$i][1] = $eleve [1] ;
       $table [$i][2] = $eleve [2] ;
       $ok = SQL_commande ("SELECT a.id_notanet_profil,p.nom,p.arrondi FROM notanet_attributions_profils_eleve a,notanet_profils p WHERE a.id_eleve='".$eleve [0]."' AND a.id_notanet_profil=p.id_notanet_profil LIMIT 1", $id_sql) ;
       If (SQL_nbr_lignes ($ok) == 1)
        {
	 $okl = SQL_ligne_suivante ($ok) ;
         $table [$i][3] = $okl [0] ;
         $table [$i][4] = $okl [1] ;
	 $table [$i][5] = $okl [2] ;
	}
       Else
        {
	 $table [$i][3] = 0 ;
         $table [$i][4] = "" ;
	 $table [$i][5] = 2 ;
        }
      }
    }
   Return $table ;
  }
 
 /**
 * Fonction qui renvoie la liste des eleves pour un prof et classe donnes
 * @param int $id_professeur Identifiant de l'enseignant
 * @param int $id_classe Identifiant de la classe
 * @return array Tableau contenant la liste des eleves
 *               Format : [0][0][0] = Nombre de services possibles
 *                         Pour $i allant de 1 a [0][0]
 *                         [$i][0][0] = Identifiant du service prof
 *                         [$i][1][0] = Identifiant code epreuve
 *                         [$i][2][0] = Code epreuve
 *                         [$i][3][0] = Nombre d'eleves
 *                         Pour $j allant de 4 a [$i][3]+3
 *                          [$i][$j][0] = Identifiant eleve
 *                          [$i][$j][1] = Identifiant code epreuve
 *                          [$i][$j][2] = Code epreuve
 */
 Function notanet_liste_eleve ($id_professeur, $id_classe)
  {
   Global $id_sql ;
   // Initialisation de la table des services possibles
   $services [0][0][0] = 0 ;
   // Recherche dans la table notanet_attributions_eleve avant de commencer
   $eleves = SQL_commande ("SELECT p.id_service_prof,a.id_notanet_code_epreuve,c.code,e.id_eleve
                              FROM notanet_attributions_eleve a,services_prof p,eleves e,disciplines d,notanet_codes_epreuves c
                             WHERE p.professeur='".$id_professeur."' AND p.classe='".$id_classe."'
			       AND p.id_service_prof=a.id_service_prof
			       AND a.id_eleve=e.id_eleve AND a.id_notanet_code_epreuve=c.id_notanet_code_epreuve
			       AND p.discipline=d.id_discipline
			     ORDER BY d.nom_long,c.code,e.nom,e.prenoms,e.date_naissance", $id_sql) ;
   $nbr_el = SQL_nbr_lignes ($eleves) ;
   If ($nbr_el > 0)
    {
     $eleve = SQL_ligne_suivante ($eleves) ;
     $services [0][0][0]++ ;
     $services [$services [0][0][0]][0][0] = $eleve [0] ; // Id service prof
     $services [$services [0][0][0]][1][0] = $eleve [1] ; // Id code epreuve
     $services [$services [0][0][0]][2][0] = $eleve [2] ; // Code epreuve
     $services [$services [0][0][0]][3][0] = 1 ;
     $services [$services [0][0][0]][4][0] = $eleve [3] ; // Id eleve
     $services [$services [0][0][0]][4][1] = $eleve [1] ; // Id code epreuve
     $services [$services [0][0][0]][4][2] = $eleve [2] ; // Code epreuve
     // Parcours tous les codes
     For ($i = 2 ; $i <= $nbr_el ; $i++)
      {
       $eleve = SQL_ligne_suivante ($eleves) ;
       //echo $services [0][0][0].")".$eleve [0]." == ".$services [$services [0][0][0]][0][0]."-=-".$eleve [1]." == ".$services [$services [0][0][0]][1][0]."<br>" ;
       // Regarde si code epreuve existe deja
       $ok_ce = 0 ;
       $j = 1 ;
       While (($j <= $services [0][0][0]) And ($ok_ce == 0))
        {
	 If ($eleve [2] == $services [$j][2][0]) { $position_ce = $j ; $ok_ce = 1 ; }
	 $j++ ;
	}
       // Regarde si l'id service prof existe deja
       $ok_sp = 0 ;
       $j = 1 ;
       While (($j <= $services [0][0][0]) And ($ok_sp == 0))
        {
	 If ($eleve [0] == $services [$j][0][0]) { $position_sp = $j ; $ok_sp = 1 ; }
	 $j++ ;
	}
       // Regarde si l'id code epreuve existe deja
       $ok_ice = 0 ;
       $j = 1 ;
       While (($j <= $services [0][0][0]) And ($ok_ice == 0))
        {
	 If ($eleve [1] == $services [$j][1][0]) { $position_ice = $j ; $ok_ice = 1 ; }
	 $j++ ;
	}
       /*If (($eleve [0] == $services [$services [0][0][0]][0][0]) And ($eleve [1] == $services [$services [0][0][0]][1][0])
           And ($eleve [2] != $services [$services [0][0][0]][2][0]))*/
       If (($ok_sp == 1) And ($ok_ce == 1))
        {
	 $services [$services [0][0][0]][3][0]++ ;
	 $num = $services [$services [0][0][0]][3][0] ;
	 $services [$services [0][0][0]][3+$num][0] = $eleve [3] ;
	 $services [$services [0][0][0]][3+$num][1] = $eleve [1] ;
	 $services [$services [0][0][0]][3+$num][2] = $eleve [2] ;
	}
       Else
        {
	 $services [0][0][0]++ ;
         $services [$services [0][0][0]][0][0] = $eleve [0] ;
         $services [$services [0][0][0]][1][0] = $eleve [1] ;
         $services [$services [0][0][0]][2][0] = $eleve [2] ;
         $services [$services [0][0][0]][3][0] = 1 ;
         $services [$services [0][0][0]][4][0] = $eleve [3] ;
	 $services [$services [0][0][0]][4][1] = $eleve [1] ;
	 $services [$services [0][0][0]][4][2] = $eleve [2] ;
	}
      }
    }
   Else
    {
     /*
     // Recherche du profil et des definitions
     $table_definition = notanet_definition_profil_classe ($id_classe) ;
     // Parcours tous les codes epreuves
     For ($i = 1 ; $i <= $table_definition [0][0][1] ; $i++)
      {
       //echo $table_definition [$i][10][0]."->" ;
       If ($table_definition [$i][10][0] > 0)
        {
         // Parcours les definitions
         $ok_disc = 0 ;
         For ($j = 1 ; $j <= $table_definition [$i][10][0] ; $j++)
          {
	   // Y a-t-il des eleves pour cette attribution ?
	   $effectif = effectif ($id_classe) ;
	   $table = eleves_par_service_classe ($table_definition [$i][10][$j]) ;
	   //echo "Eff=".$effectif."-Nb El=".$table [0]."->" ;
	   // Si c'est tous les eleves qui n'ont pas encore ete attribues alors OK
	   If (($table [0] == $effectif) And ($ok_disc == 0))
	    {
	     $ok_disc = 1 ;
	     // Si, en plus c'est le bon prof, alors cerise sur le gateau !
	     //echo "id P=".$table_definition [$i][11][$j]."-Id P=".$id_professeur."->" ;
	     If ($table_definition [$i][11][$j] == $id_professeur)
	      {
	       $services [0][0]++ ;
	       $services [$services [0][0]][0] = $table_definition [$i][10][$j] ;
	       $services [$services [0][0]][1] = $table_definition [$i][0][0] ;
	       $services [$services [0][0]][2] = $table_definition [$i][0][1] ;
	       $services [$services [0][0]][3] = $table [0] ;
	       //echo "OK->Service n=".$services [0][0]."->Id SP=".$services [$services [0][0]][0]."-Nbr el=".$services [$services [0][0]][1] ;
	       For ($k = 1 ; $k <= $table [0] ; $k++)
	        {
	         $services [$services [0][0]][$k+3] = $table [$k] ;
	        }
	      }
	     Else
	      {
	       //echo "NON ok" ;
	      }
	    }
	   Else
	    {
	     If ($ok_disc == 0)
	      {
	       // On a pas tous les eleves donc certainement en groupe ou option
	       //echo "Recherche groupe." ;
	      }
	     Else
	      {
	       //echo "Non OK." ;
	      }
	    }
	   //echo "<br>" ;
	  }
        }
       Else
        {
	 //echo "Pas de definition." ;
	}
       //echo "<br>" ;
      }
     */
    }
   Return $services ;
  }
 
 /**
 * Fonction qui renvoie la liste des eleves pour un cpe et classe donnes
 * @param int $id_classe Identifiant de la classe
 * @return array Tableau contenant la liste des eleves
 *               Format : [0][0][0] = Nombre de services possibles
 *                         Pour $i allant de 1 a [0][0]
 *                         [$i][0][0] = Identifiant du service prof
 *                         [$i][1][0] = Identifiant code epreuve
 *                         [$i][2][0] = Code epreuve
 *                         [$i][3][0] = Nombre d'eleves
 *                         Pour $j allant de 4 a [$i][3]+3
 *                          [$i][$j][0] = Identifiant eleve
 *                          [$i][$j][1] = Identifiant code epreuve
 *                          [$i][$j][2] = Code epreuve
 *               Format : [0][0][0] = 0=Non OK, >0=Nombre de services
 *                         Pour $i allant de 1 a [0][0]
 *                         [$i][1][0] = Identifiant du service : -4
 *                         [$i][2][0] = 0
 *                         [$i][3][0] = 0
 *                         [$i][4][0] = Identifiant de la classe
 *                         [$i][5][0] = Identifiant code epreuve
 *                         [$i][6][0] = Code epreuve
 *                         [$i][7][0] = Nombre d'eleves
 *                         Pour $j allant de 8 a [$i][7][0]+7
 *                          [$i][$j][0] = Identifiant eleve
 *                          [$i][$j][1] = Identifiant code epreuve
 *                          [$i][$j][2] = Code epreuve
 */
 Function notanet_liste_eleve_vie_scolaire ($id_classe)
  {
   Global $id_sql ;
   // Initialisation de la table des services possibles
   $services [0][0][0] = 0 ;
   // Recherche dans la table notanet_attributions_eleve
   $eleves = SQL_commande ("SELECT a.id_service_prof,a.id_notanet_code_epreuve,c.code,e.id_eleve
                              FROM eleves e,notanet_attributions_eleve a,notanet_codes_epreuves c
			     WHERE e.classe='".$id_classe."' AND e.id_eleve=a.id_eleve AND a.id_service_prof='-4'
			       AND a.id_notanet_code_epreuve=c.id_notanet_code_epreuve
			  ORDER BY c.code,e.nom,e.prenoms,e.date_naissance", $id_sql) ;
   $nbr_el = SQL_nbr_lignes ($eleves) ;
   If ($nbr_el > 0)
    {
     $eleve = SQL_ligne_suivante ($eleves) ;
     $services [0][0][0]++ ;
     $services [$services [0][0][0]][1][0] = $eleve [0] ;
     $services [$services [0][0][0]][2][0] = 0 ;
     $services [$services [0][0][0]][3][0] = 0 ;
     $services [$services [0][0][0]][4][0] = $id_classe ;
     $services [$services [0][0][0]][5][0] = $eleve [1] ;
     $services [$services [0][0][0]][6][0] = $eleve [2] ; ;
     $services [$services [0][0][0]][7][0] = 1 ;
     $services [$services [0][0][0]][8][0] = $eleve [3] ;
     $services [$services [0][0][0]][8][1] = $eleve [1] ;
     $services [$services [0][0][0]][8][2] = $eleve [2] ;
     // Parcours tous les codes
     For ($i = 2 ; $i <= $nbr_el ; $i++)
      {
       $eleve = SQL_ligne_suivante ($eleves) ;
       If ($eleve [0] == $services [$services [0][0][0]][1][0]) //And ($eleve [1] == $services [$services [0][0][0]][5][0]))
        {
	 $services [$services [0][0][0]][7][0]++ ;
	 $indice = $services [$services [0][0][0]][7][0] ;
	 $services [$services [0][0][0]][7+$indice][0] = $eleve [3] ;
	 $services [$services [0][0][0]][7+$indice][1] = $eleve [1] ;
	 $services [$services [0][0][0]][7+$indice][2] = $eleve [2] ;
	}
       Else
        {
	 $services [0][0][0]++ ;
	 $services [$services [0][0][0]][1][0] = $eleve [0] ;
         $services [$services [0][0][0]][2][0] = 0 ;
         $services [$services [0][0][0]][3][0] = 0 ;
         $services [$services [0][0][0]][4][0] = $id_classe ;
         $services [$services [0][0][0]][5][0] = $eleve [1] ;
         $services [$services [0][0][0]][6][0] = $eleve [2] ; ;
         $services [$services [0][0][0]][7][0] = 1 ;
         $services [$services [0][0][0]][8][0] = $eleve [3] ;
	 $services [$services [0][0][0]][8][1] = $eleve [1] ;
	 $services [$services [0][0][0]][8][2] = $eleve [2] ;
	}
      }
    }
   Return $services ;
  }
 
 /**
 * Fonction qui renvoie la liste des eleves pour un service prof uniquement
 * @param int $id_service_prof Identifiant du service prof
 * @return array Tableau contenant la liste des eleves
 *               Format : [0][0][0] = 0=Non OK, >0=Nombre de services
 *                         Pour $i allant de 1 a [0][0]
 *                         [$i][1][0] = Identifiant du service prof
 *                         [$i][2][0] = Identifiant de la discipline
 *                         [$i][3][0] = Identifiant du professeur ou alias (<0)
 *                         [$i][4][0] = Identifiant de la classe
 *                         [$i][5][0] = Identifiant code epreuve
 *                         [$i][6][0] = Code epreuve
 *                         [$i][7][0] = Nombre d'eleves
 *                         Pour $j allant de 8 a [$i][7][0]+7
 *                          [$i][$j][0] = Identifiant eleve
 *                          [$i][$j][1] = Identifiant code epreuve
 *                          [$i][$j][2] = Code epreuve
 */
 Function notanet_liste_eleve_par_service_prof ($id_service_prof)
  {
   Global $id_sql,$debug_SQL ;
   $services [0][0][0] = 0 ;
   If ($id_service_prof > 0)
    {
     $car = SQL_commande ("SELECT professeur,classe,discipline FROM services_prof WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($car) == 1)
      {
       $c = SQL_ligne_suivante ($car) ;
       // Alias ?
       //If ($c [0] < 0) { $t = alias_enseignant_principal (-$c [0]) ; $c [0] = $t [0] ; }
       // Recherche tous les services possibles pour l'id prof et classe correspondant
       $liste = notanet_liste_eleve ($c [0], $c [1]) ;
       // Trie les services
       $i = 1 ;
       $ok = 0 ;
       While ($i <= $liste [0][0][0])
        {
         If ($liste [$i][0][0] == $id_service_prof)
          {
	   $services [0][0][0]++ ;
	   $services [$services [0][0][0]][1][0] = $liste [$i][0][0] ;
	   $services [$services [0][0][0]][2][0] = $c [2] ;
	   $services [$services [0][0][0]][3][0] = $c [0] ;
	   $services [$services [0][0][0]][4][0] = $c [1] ;
	   $services [$services [0][0][0]][5][0] = $liste [$i][1][0] ;
	   $services [$services [0][0][0]][6][0] = $liste [$i][2][0] ;
	   $services [$services [0][0][0]][7][0] = $liste [$i][3][0] ;
	   For ($j = 1 ; $j <= $liste [$i][3][0] ; $j++)
	    {
	     $services [$services [0][0][0]][7+$j][0] = $liste [$i][3+$j][0] ;
	     $services [$services [0][0][0]][7+$j][1] = $liste [$i][3+$j][1] ;
	     $services [$services [0][0][0]][7+$j][2] = $liste [$i][3+$j][2] ;
	    }
	  }
         $i++ ;
        }
      }
    }
   Return $services ;
  }
 
 /**
 * Fonction qui renvoi l'identifiant de la saisie pour un eleve, un code epreuve et un service prof
 * @param int $id_notanet_code_epreuve Identifiant du code epreuve
 * @param int $id_eleve Identifiant eleve
 * @param int $id_service_prof Identifiant du service prof
 * @return int Identifiant de la saisie (si != 0) sinon 0 (si n'existe pas)
 */
 Function notanet_id_saisie ($id_notanet_code_epreuve, $id_eleve, $id_service_prof)
  {
   Global $id_sql ;
   $saisie = SQL_commande ("SELECT id_notanet_saisie FROM notanet_saisies WHERE id_notanet_code_epreuve='".$id_notanet_code_epreuve."' AND id_eleve='".$id_eleve."' AND id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($saisie) == 1)
    {
     $s = SQL_ligne_suivante ($saisie) ;
     Return $s [0] ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Fonction qui renvoi la saisie pour un eleve, un code epreuve et un service prof
 * @param int $id_notanet_code_epreuve Identifiant du code epreuve
 * @param int $id_eleve Identifiant eleve
 * @param int $id_service_prof Identifiant du service prof
 * @return array [0]=Identifiant saisie,[1]=note,[2]=appreciation
 */
 Function notanet_saisie ($id_notanet_code_epreuve, $id_eleve, $id_service_prof)
  {
   Global $id_sql ;
   $saisie = SQL_commande ("SELECT id_notanet_saisie,note,appreciation FROM notanet_saisies WHERE id_code_epreuve='".$id_notanet_code_epreuve."' AND id_eleve='".$id_eleve."' AND id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($saisie) == 1)
    {
     $s = SQL_ligne_suivante ($saisie) ;
     Return $s ;
    }
   Else
    {
     // Recherche de l'id si c'est pa sle service prof
     $saisie = SQL_commande ("SELECT id_notanet_saisie,note,appreciation,id_service_prof FROM notanet_saisies WHERE id_code_epreuve='".$id_notanet_code_epreuve."' AND id_eleve='".$id_eleve."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($saisie) == 1)
      {
       $s = SQL_ligne_suivante ($saisie) ;
       If ($s [3] != $id_service_prof) { $ok = SQL_commande ("UPDATE notanet_saisies SET id_service_prof='".$id_service_prof."' WHERE id_notanet_saisie='".$s [0]."' LIMIT 1", $id_sql) ; }
       Return $s ;
      }
     Else { Return Array ("","") ; }
    }
  }
 
 /**
 * Fonction qui renvoi la saisie pour un identifiant de saisie
 * @param int $id_notanet_saisie Identifiant de la saisie
 * @return array [0]=Identifiant saisie,[1]=note,[2]=appreciation
 */
 Function notanet_saisie_par_id_notanet_saisie ($id_notanet_saisie)
  {
   Global $id_sql ;
   $saisie = SQL_commande ("SELECT id_notanet_saisie,note,appreciation FROM notanet_saisies WHERE id_notanet_saisie='".$id_notanet_saisie."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($saisie) == 1)
    {
     $s = SQL_ligne_suivante ($saisie) ;
     Return $s ;
    }
   Else { Return Array ("","") ; }
  }

 /**
 * PARTIE VERIFICATIONS
 */
 /**
 * Renvoi l'identifiant de disicpline si le code epreuve est corect pour un eleve
 * @param int $id_eleve Identifiant eleve
 * @param int $id_code_epreuve Identifiant du code epreuve a verifier
 * @return int Identifiant discipline si existe sinon 0
 */
 Function notanet_verif_attribution_eleve ($id_eleve, $id_code_epreuve)
  {
   Global $id_sql ;
   $ok = SQL_commande ("SELECT id_service_prof FROM notanet_attributions_eleve WHERE id_eleve='".$id_eleve."' AND id_notanet_code_epreuve='".$id_code_epreuve."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($ok) == 1)
    {
     $resultat = SQL_ligne_suivante ($ok) ;
     Return $resultat [0] ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Fonction de verification des INE eleves
 * @return array Table contenant l'id eleve et l'id classe n'ayant pas d'INE
 *               Format : [0][0] : Nombre d'eleves
 *                        [$i][0] : Id classe
 *                        [$i][1] : Id eleve
 */
 Function notanet_verif_ine_eleve ()
  {
   Global $id_sql ;
   $table [0][0] = 0 ;
   // Recherche des classes
   $classes = SQL_commande ("SELECT etablissement,id_classe FROM classes ORDER BY nom_bref,nom", $id_sql) ;
   $nbr_classes = SQL_nbr_lignes ($classes) ;
   If ($nbr_classes > 0)
    {
     $requete = "SELECT e.classe,e.id_eleve FROM eleves e,classes c WHERE e.repere2='' AND e.classe=c.id_classe AND (" ;
     $ok_act = 0 ;
     For ($i = 0 ; $i < $nbr_classes ; $i++)
      {
       // Classe activee notanet ?
       $classe = SQL_ligne_suivante ($classes) ;
       $activation = restaure_configuration ("SYSTEME_PARAM", "NOTANET_".$classe [0], "CLASSE_".$classe [1]) ;
       If ($activation == 1)
        {
	 If ($ok_act == 1) { $requete .= " OR " ; }
	 $requete .= "e.classe='".$classe [1]."'" ;
	 $ok_act = 1 ;
	}
      }	
     If ($ok_act == 1)
      {
       $requete .= ") ORDER BY c.nom_bref,c.nom,e.nom,e.prenoms" ;
       $sans_rep = SQL_commande ($requete, $id_sql) ;
       $nbr_sr = SQL_nbr_lignes ($sans_rep) ;
       If ($nbr_sr > 0)
        {
	 $table [0][0] = $nbr_sr ;
         For ($i = 1 ; $i <= $nbr_sr ; $i++)
          {
	   $lge = SQL_ligne_suivante ($sans_rep) ;
	   $table [$i][0] = $lg [0] ; // Id classe
	   $table [$i][1] = $lg [1] ; // Id eleve
	  }
	}
      }
    }
   Return $table ;
  }
 
 /**
 * Function qui renvoi sous forme d'un tableau l'etat du remplissage (binaire)
 * @param int $id_eleve Identifiant de l'eleve
 * @return array [0]=Affichage en HTML de l'etat,[1]=Pourcentage de remplissage notes eleve,[2]=Pourcentage de remplissage appreciations eleve
 *               [3]=Nbr total notes,[4]=Nbr notes
 *               [5]=Nbr total appreciations,[6]=Nbr appreciations
 */
 Function notanet_etat_remplissage_eleve ($id_eleve)
  {
   Global $id_sql ;
   $pourc_notes = $pourc_app = 0 ;
   $nbr_notes = $nbr_app = 0 ;
   $nbr_total_notes = $nbr_total_app = 0 ;
   $ligne = "<table border=\0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border:0px #000000 solid;border-collapse:collapse\">" ;
   // Recherche profil eleve
   $pe = SQL_commande ("SELECT id_notanet_profil FROM notanet_attributions_profils_eleve WHERE id_eleve='".$id_eleve."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($pe) == 1)
    {
     $profil = SQL_ligne_suivante ($pe) ;
     // Recherche des codes epreuves obligatoires
     $cdep = SQL_commande ("SELECT DISTINCT c.id_notanet_code_epreuve,c.code FROM notanet_codes_epreuves c,notanet_proprietes p WHERE c.id_notanet_profil='".$profil [0]."' AND c.id_notanet_code_epreuve=p.id_notanet_code_epreuve AND p.mouvement='1' ORDER BY c.code", $id_sql) ;
     $nbr_cdep = SQL_nbr_lignes ($cdep) ;
     If ($nbr_cdep > 0)
      {
       $ligne0 = "<tr>";//<td align=\"right\">&nbsp;Codes&nbsp;&eacute;preuves&nbsp;</td>" ;
       $ligne1 = "<tr>";//<td align=\"right\">&nbsp;Notes&nbsp;</td>" ;
       $ligne2 = "<tr>";//<td align=\"right\">&nbsp;Appr&eacute;ciations&nbsp;</td>" ;
       $nbr_notes = $nbr_app = 0 ;
       $nbr_total_notes = $nbr_total_app = 0 ; //$nbr_cdep ;
       For ($i = 0 ; $i < $nbr_cdep ; $i++)
        {
	 $cdepl = SQL_ligne_suivante ($cdep) ;
	 If (notanet_verif_attribution_eleve ($id_eleve, $cdepl [0]) != 0)
	  {
	   $ligne0 .= "<td width=\"35\">&nbsp;<font size=\"-1\">".$cdepl [1]."</font>&nbsp;</td>" ;
	   // Recherche etat remplissage du code epreuve
	   $erce = SQL_commande ("SELECT note,appreciation FROM notanet_saisies WHERE id_eleve='".$id_eleve."' AND id_code_epreuve='".$cdepl [0]."' LIMIT 1", $id_sql) ;
	   If (SQL_nbr_lignes ($erce) == 1)
	    {
	     $ercel = SQL_ligne_suivante ($erce) ;
	     If ($ercel [0] != "") { $c1 = "#00ff00" ; $nbr_notes++ ; } Else { $c1 = "#ff0000" ; }
	     If ($ercel [1] != "") { $c2 = "#00ff00" ; $nbr_app++ ; } Else { $c2 = "#ff0000" ; }
	    }
	   Else { $c1 = $c2 = "#ff0000" ; }
	   $ligne1 .= "<td bgcolor=\"".$c1."\" height=\"3\"> </td>" ;
	   $ligne2 .= "<td bgcolor=\"".$c2."\" height=\"3\"> </td>" ;
	   $nbr_total_notes++ ;
	   $nbr_total_app++ ;
	  }
	 Else
	  {
	   $ligne0 .= "<td width=\"35\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>" ;
	   $ligne1 .= "<td> </td>" ;
	   $ligne2 .= "<td> </td>" ;
	  }
	}
       $ligne .= $ligne0."</tr>".$ligne1."</tr>" ; //.$ligne2."</tr>" ;
       $pourc_notes = $nbr_notes*100/$nbr_total_notes ;
       $pourc_app = $nbr_app*100/$nbr_total_app ;
      }
     Else
      {
       $ligne .= "<tr><td bgcolor=\"#ff0000\">&nbsp;<b>Aucune&nbsp;&eacute;preuve&nbsp;d&eacute;finie</b>&nbsp;</td></tr>" ;
      }
    }
   Else
    {
     $ligne .= "<tr><td bgcolor=\"#ff0000\">&nbsp;<b>Pas&nbsp;de&nbsp;profil</b>&nbsp;</td></tr>" ;
    }
   $ligne .= "</table>" ;
   Return Array ($ligne,$pourc_notes,$pourc_app,$nbr_total_notes,$nbr_notes,$nbr_total_app,$nbr_app) ;
  }
 
 /**
 * PARTIE FILTRAGE DE LA BASE
 */
 /**
 * Fonction de filtrage des notes
 * @param string $note Note a filtrer
 * @param int $type_arrondi Numero de l'arrondi a appliquer
 * @param int $total Est-ce un total (1) ou pas (0)
 * @return string Note filtree
 */
 Function notanet_filtrage_note ($note, $type_arrondi, $total)
  {
   Global $absent, $non_note, $dispense ;
   $resultat = "" ;
   If (Is_Numeric ($note))
    {
     If ($total == 0)
      {
       $note = arrondi_note ($note, $type_arrondi) ;
       $n = Explode (".", $note) ;
       If ((integer)$n [0] < 10) { $resultat .= "0" ; }
       $resultat .= $n [0].".".SubStr ($n [1], 0, 2) ;
       If (StrLen ($n [1]) <= 1) { $resultat .= SubStr ("00", 0, 2-StrLen ($n [1])) ; }
      }
     Else
      {
       $n = Explode (".", $note) ;
       $resultat = SubStr ("000", 0, 3-StrLen ($n [0])).$n [0].".".SubStr ($n [1], 0, 2) ;
       If (StrLen ($n [1]) <= 1) { $resultat .= SubStr ("00", 0, 2-StrLen ($n [1])) ; }
      }
    }
   Else
    {
     $resultat = StrToUpper (SubStr ($note, 0, 2)) ;
     // Si la note n'est pas numerique et qu'en plus, elle ne fait parti du lot, alors par defaut c'est non note (NN)
     If (($resultat != $absent) And ($resultat != $non_note) And ($resultat !=  $dispense)) { $resultat = $non_note ; }
    }
   Return $resultat ;
  }
 
 /**
 * Fonction de recherche du nombre dans une chaine de caracteres de note
 * @param string $note Note a filtrer
 * @return string Note filtree ou la note elle-meme si pas de valeur numerique
 */
 Function notanet_recherche_partie_numerique_note ($note)
  {
   $resultat = $note ;
   If (!Is_Numeric ($note))
    {
     $note_bis = filtrage_utf8 ($note) ;
     $arret = $ok = $depart = $fin = 0 ;
     $i = 0 ;
     While (($i < StrLen ($note)) And ($arret == 0))
      {
       If (((Ord (SubStr ($note, $i, 1)) >= Ord ("0")) And (Ord (SubStr ($note, $i, 1)) <= Ord ("9"))) Or (Ord (SubStr ($note, $i, 1)) == Ord (".")) Or (Ord (SubStr ($note, $i, 1)) == Ord (",")))
        {
	 If ((Ord (SubStr ($note, $i, 1)) == Ord (".")) Or (Ord (SubStr ($note, $i, 1)) == Ord (","))) { If ($ok == 1) { $fin = $i ; } }
	 ElseIf ($ok == 0) { $ok = 1 ; $depart = $fin = $i ; } Else { $fin = $i ; }
	}
       ElseIf ($ok == 1) { $arret = 1 ; }
       $i++ ;
      }
     If ($ok == 1) { $resultat = SubStr ($note, $depart, $fin-$depart+1) ; }
    }
   Return $resultat ;
  }
 
 /**
 * Fonction de filtrage des notes sur la base de donnees
 * @return array Etat du filtrage
 */
 Function notanet_filtrage_notes_base ()
  {
   Global $id_sql ;
   /*
   SELECT  e.nom,e.prenoms,c.nom,e.id_eleve,n.id_notanet_saisie,n.note,n.appreciation,n.id_service_prof
   FROM  `notanet_saisies` n,eleves e,classes c
   WHERE (n.id_notanet_saisie=1507 OR n.id_notanet_saisie=1538 OR n.id_notanet_saisie=60 OR n.id_notanet_saisie=579
          OR n.id_notanet_saisie=908 OR n.id_notanet_saisie=889 OR n.id_notanet_saisie=891 OR n.id_notanet_saisie=2505
	  OR n.id_notanet_saisie=894 OR n.id_notanet_saisie=394 OR n.id_notanet_saisie=2588 OR n.id_notanet_saisie=329)
	  AND n.id_eleve=e.id_eleve AND e.classe=c.id_classe ORDER BY c.nom,e.nom,e.prenoms
   */
   $base_complete = SQL_commande ("SELECT * FROM notanet_saisies", $id_sql) ;
   $nbr = SQL_nbr_lignes ($base_complete) ;
   For ($i = 0 ; $i < $nbr ; $i++)
    {
     $ligne = SQL_tableau_associatif ($base_complete, "") ;
     $note_filtree = notanet_recherche_partie_numerique_note ($ligne ["note"]) ;
     //If ($note_filtree != $ligne ["note"]) { Echo $ligne ["id_notanet_saisie"].")".$ligne ["note"]."->".$note_filtree."<br>" ; }
    }
  }
 
 /**
 * Fonction qui renvoi l'operateur en fonction de son numero
 * @param int $operateur Numero de l'operateur
 * @return string Operateur reel
 */
 Function notanet_operateur ($operateur)
  {
   $o = "" ;
   Switch ($operateur)
    {
     Default :
      Case 0 : $o = "" ; Break ;
      Case 1 : $o = "=" ; Break ;
      Case 2 : $o = ">" ; Break ;
      Case 3 : $o = ">=" ; Break ;
      Case 4 : $o = "<" ; Break ;
      Case 5 : $o = "<=" ; Break ;
    }
   Return $o ;
  }
 
 /**
 * Fonction qui renvoi le nombre d'operateurs
 * @return int Nombre d'operateurs reels
 */
 Function notanet_nombre_operateurs ()
  {
   Return 6 ;
  }
 
 /**
 * Fonction de comparaison
 * @param string $chaine Chaine de comparaison
 * @param string $valeur Valeur a comparer
 * @param int $mode Mode de fonctionnement (0=Renvoi les operateurs, 1=Compare)
 * @return mixed Renvoi un booleen si $mode=1 (Vrai ou Faux) ou un tableau si mode=0 :
 *       [0]=Valeur 1
 *       [1]=Operateur 1
 *       [2]=Valeur 2
 *       [3]=Operateur 2
 */
 Function notanet_comparaison_saisie ($chaine, $valeur, $mode)
  {
   If ($mode == 0)
    {
     // Decortique la chaine
     $c = Explode ("|", $chaine) ;
     $c [1] = notanet_operateur ((integer)$c [1]) ;
     $c [2] = notanet_operateur ((integer)$c [2]) ;
     Return $c ;
    }
   ElseIf ($mode == 1)
    {
     $c = Explode ("|", $chaine) ;
     $c [1] = notanet_operateur ((integer)$c [1]) ; If ($c [1] == "=") { $c [1] = "==" ; }
     $c [2] = notanet_operateur ((integer)$c [2]) ; If ($c [2] == "=") { $c [2] = "==" ; }
     // Comparaison 1
     If (($c [0] != "") And ($c [1] != "")) { $ok1 = 1 ; $compare = $c [0].$c [1].$valeur ; }
     Else { $ok1 = 0 ; $compare = "" ; }
     // Comparaison 2
     If (($c [2] != "") And ($c [3] != ""))
      {
       If ($ok1 == 1) { $compare = "(".$compare.") And (".$valeur.$c [2].$c [3].")" ; }
       Else { $compare = $valeur.$c [2].$c [3] ; }
      }
     Eval ("If (".$compare."){\$ok=1;}else{\$ok=0;}") ;
     Return $ok ;
    }
  }
 
 /**
 * PARTIE EXPORTATION DES DONNEES
 */
 /**
 * Fonction generant l'exportation des donnees avec fin de lignes adaptees
 * @param int $id_classe Identifiant classe
 * @param int $simulation Simulation (1) ou pas (0)
 * @param string Exportation texte
 */
 Function notanet_exportation ($id_classe, $simulation)
  {
   Global $id_sql, $absent, $non_note, $dispense, $fin_ligne, $separateur ;
   $texte = "" ;
   //$eleves = notanet_profil_eleves ($id_classe) ;
   $eleves [0][0] = 0 ;
   // Recherche tous les eleves
   $els = SQL_commande ("SELECT id_eleve,nom,prenoms,repere1,repere2 FROM eleves WHERE classe='".$id_classe."' ORDER BY repere2", $id_sql) ;
   $nbr = SQL_nbr_lignes ($els) ;
   If ($nbr > 0)
    {
     $eleves [0][0] = $nbr ;
     For ($i = 1 ; $i <= $nbr ; $i++)
      {
       $el = SQL_ligne_suivante ($els) ;
       $eleves [$i][0] = $el [0] ;
       $eleves [$i][1] = $el [1] ;
       $eleves [$i][2] = $el [2] ;
       $eleves [$i][3] = $el [3] ;
       $eleves [$i][4] = $el [4] ;
       $ok = SQL_commande ("SELECT a.id_notanet_profil,p.nom,p.arrondi FROM notanet_attributions_profils_eleve a,notanet_profils p WHERE a.id_eleve='".$el [0]."' AND a.id_notanet_profil=p.id_notanet_profil LIMIT 1", $id_sql) ;
       If (SQL_nbr_lignes ($ok) == 1)
        {
	 $okl = SQL_ligne_suivante ($ok) ;
         $eleves [$i][5] = $okl [0] ;
         $eleves [$i][6] = $okl [1] ;
	 $eleves [$i][7] = $okl [2] ;
	}
       Else
        {
	 $eleves [$i][5] = 0 ;
         $eleves [$i][6] = "" ;
	 $eleves [$i][7] = 2 ;
        }
      }
    }
   If ($eleves [0][0] > 0)
    {
     $erreur [0][0] = 0 ;
     // Parcours tous les eleves
     For ($i = 1 ; $i <= $eleves [0][0] ; $i++)
      {
       // Profil ?
       If ($eleves [$i][5] > 0)
        {
	 // Recherche INE eleve
	 //$ine_el = SQL_commande ("SELECT repere2,nom,prenoms FROM eleves WHERE id_eleve='".$eleves [$i][0]."' LIMIT 1", $id_sql) ;
	 //$ine = SQL_ligne_suivante ($ine_el) ;
	 If ($eleves [$i][4] != "")
	  {
           // Recherche les codes epreuves par rapport au profil eleve
           $codes_epreuves = SQL_commande ("SELECT id_notanet_code_epreuve,code FROM notanet_codes_epreuves WHERE id_notanet_profil='".$eleves [$i][5]."' ORDER BY code", $id_sql) ;
	   $nbr_codes = SQL_nbr_lignes ($codes_epreuves) ;
	   If ($nbr_codes > 0)
	    {
	     $total = 0 ;
	     $ok_recherche = 1 ;
	     If ($simulation == 1) { $texte .= "======= &Eacute;l&egrave;ve : ".$eleves [$i][1]." ".$eleves [$i][2]." =======".$fin_ligne."_______ Passe 1 : Recherche _______".$fin_ligne ; }
	     $notes [0][0] = 0 ;
	     For ($j = 0 ; $j < $nbr_codes ; $j++)
	      {
	       $code = SQL_ligne_suivante ($codes_epreuves) ;
	       If (notanet_verif_attribution_eleve ($eleves [$i][0], $code [0]) != 0)
	        {
	         // Caracteristiques du code epreuve
	         $car_code = notanet_caracteristiques_code ($code [0]) ;
	         // Recherche note attribuee
	         $note_el = SQL_commande ("SELECT note FROM notanet_saisies WHERE id_eleve='".$eleves [$i][0]."' AND id_code_epreuve='".$code [0]."' LIMIT 1", $id_sql) ;
	         If (SQL_nbr_lignes ($note_el) == 1)
	          {
		   // Saisie
	           $note = SQL_ligne_suivante ($note_el) ;
		   $note [0] = notanet_recherche_partie_numerique_note ($note [0]) ;
	           // Est-ce une option (2)
		   If ($car_code [0][1] == 2)
		    {
		     If (Is_Numeric ($note [0]))
		      {
		       $note_code = notanet_filtrage_note ($note [0], $eleves [$i][7], 0) ;
		       // On prend la valeur au dessus de la moitie de la note maximale autorisee si possible sinon 0
		       If ($note_code <= Round ($car_code [0][2]*$car_code [0][3]/2))
		        {
		         $note_code = notanet_filtrage_note (0, $eleves [$i][7], 0) ;
		        }
		       Else
		        {
		         //If ($simulation == 1) { $texte .= "Optionnelle -> ".$note_code."-".($car_code [0][2]*$car_code [0][3]/2)."=".($note_code-Round ($car_code [0][2]*$car_code [0][3]/2)).$fin_ligne ; }
		         $total += $note_code-Round ($car_code [0][2]*$car_code [0][3]/2) ;
		         $note_code = notanet_filtrage_note ($note_code-Round ($car_code [0][2]*$car_code [0][3]/2), $eleves [$i][7], 0) ;
		        }
		       // Enregistrement
		       $notes [0][0]++ ;
		       $notes [$notes [0][0]][0] = 1 ; // OK
		       $notes [$notes [0][0]][1] = $eleves [$i][4] ; // Numero INE Eleve
		       $notes [$notes [0][0]][2] = $code [1] ; // Code epreuve
		       $notes [$notes [0][0]][3] = $note_code ; // Saisie codee
		      }
		    }
		   Else
		    {
		     // Arrondi si numerique
		     If ($car_code [0][1] != 0) { $note_code = notanet_filtrage_note ($note [0], $eleves [$i][7], 0) ; }
		     Else { $note_code = $note [0] ; }
		     // Enregistrement
		     $notes [0][0]++ ;
		     $notes [$notes [0][0]][0] = 1 ; // OK
		     $notes [$notes [0][0]][1] = $eleves [$i][4] ; // Numero INE Eleve
		     $notes [$notes [0][0]][2] = $code [1] ; // Code epreuve
		     $notes [$notes [0][0]][3] = $note_code ; // Saisie codee
		     // Note normale (1) ?
	             If ($car_code [0][1] == 1) { $total += $note_code ; }
		    }
		   If ($simulation == 1) { $texte .= $eleves [$i][4].$separateur.$code [1].$separateur.$note_code.$separateur."->OK (total=".$total.") ".$fin_ligne ; }
	          }
	         Else
	          {
		   $ok_recherche = 0 ;
	           // Pas de saisie -> Est-ce obligatoire ?
	           If ($car_code [0][4] == 1)
	            {
		     // Oui donc non note
		     If ($simulation == 1) { $texte .= $eleves [$i][4].$separateur.$code [1].$separateur.$non_note.$separateur."->PAS DE SAISIE".$fin_ligne ; }
		     $notes [0][0]++ ;
		     $notes [$notes [0][0]][0] = 1 ; // OK
		     $notes [$notes [0][0]][1] = $eleves [$i][4] ; // Numero INE Eleve
		     $notes [$notes [0][0]][2] = $code [1] ; // Code epreuve
		     $notes [$notes [0][0]][3] = $non_note ; // Saisie codee
		    }
		   Else
		    {
		     // Pas de saisie mais non obligatoire donc ok
		    }
	          }
		}
	      }
	     // Verifications...
	     If ($simulation == 1)
	      {
	       If ($ok_recherche == 1) { $texte .= "Ok.".$fin_ligne ; }
	       $texte .= "_______ Passe 2 : V&eacute;rifications _______".$fin_ligne ;
	      }
	     // Y a-t-il un code Absent ?
	     $ok_abs = 0 ;
	     For ($j = 1 ; $j <= $notes [0][0] ; $j++)
	      {
	       If ($notes [$j][3] == $absent) { $ok_abs = 1 ; }
	      }
	     If ($ok_abs == 1)
	      {
	       // Oui donc absent partout et total nulle
	       If ($simulation == 1) { $texte .= "Code absent trouv&eacute; : G&eacute;n&eacute;ration pour toutes les &eacute;preuves du code absent.".$fin_ligne ; }
	       For ($j = 1 ; $j <= $notes [0][0] ; $j++)
	        {
	         $notes [$j][3] = $absent ;
	        }
	       $total = 0 ;
	      }
	     ElseIf ($simulation == 1) { $texte .= "Aucun code absent.".$fin_ligne ; }
	     
	     // Generation des codes
	     If ($simulation == 1) { $texte .= "_______ Passe 3 : G&eacute;n&eacute;ration _______".$fin_ligne ; }
	     For ($j = 1 ; $j <= $notes [0][0] ; $j++)
	      {
               $texte .= $notes [$j][1].$separateur.$notes [$j][2].$separateur.$notes [$j][3].$separateur.$fin_ligne ;
	      }
	     // Total des epreuves
	     $texte .= $eleves [$i][4].$separateur."TOT".$separateur.notanet_filtrage_note ($total, 0, 1).$separateur.$fin_ligne ;
	    }
	   Else
	    {
	     // Pas de code epreuve -> On passe !
	     $erreur [0][0]++ ;
	     $erreur [$erreur [0][0]][0] = $eleves [$i][0] ;
	     $erreur [$erreur [0][0]][1] = 3 ; // Pas de code epreuve
	    }
	  }
	 Else
  	  {
	   // Pas d'INE -> On passe !
	   $erreur [0][0]++ ;
	   $erreur [$erreur [0][0]][0] = $eleves [$i][0] ;
	   $erreur [$erreur [0][0]][1] = 2 ; // Pas d'INE
	  }
	}
       Else
        {
	 // Aucun profil attribue a l'eleve -> On passe !
	 $erreur [0][0]++ ;
	 $erreur [$erreur [0]][0] = $eleves [$i][0] ;
	 $erreur [$erreur [0]][1] = 1 ; // Pas de profil
	}	 
      }
    }
   Return $texte ;
  }
?>